﻿//===============================================================================
// Microsoft patterns & practices Enterprise Library Contribution
// Query Application Block
//===============================================================================

using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder;
using Microsoft.Practices.ObjectBuilder2;
using EntLibContrib.Query.Instrumentation;
using EntLibContrib.Query.Queries;

namespace EntLibContrib.Query.Configuration
{
	/// <summary>
	/// This type supports the Enterprise Library infrastructure and is not intended to be used directly from your code.
	/// Represents the process to build an <see cref="WebServiceQuery"/> described by a <see cref="WebServiceQueryData"/> configuration object.
	/// </summary>
	/// <remarks>This type is linked to the <see cref="QueryDataBase"/> type and it is used by the <see cref="QueryCustomFactory"/> 
	/// to build the specific <see cref="IQuery"/> object represented by the configuration object.
	/// </remarks>	
	public class WebServiceQueryAssembler : IAssembler<IQuery, QueryDataBase>
	{
		#region Public Methods
		/// <summary>
		/// This method supports the Enterprise Library infrastructure and is not intended to be used directly from your code.
		/// Builds a <see cref="WebServiceQuery"/> based on an instance of <see cref="WebServiceQueryData"/>.
		/// </summary>
		/// <param name="context">The <see cref="IBuilderContext"/> that represents the current building process.</param>
		/// <param name="objectConfiguration">The configuration object that describes the object to build. Must be an instance of <see cref="WebServiceQueryData"/>.</param>
		/// <param name="configurationSource">The source for configuration objects.</param>
		/// <param name="reflectionCache">The cache to use retrieving reflection information.</param>
		/// <returns>
		/// A fully initialized instance of <see cref="WebServiceQuery"/>.
		/// </returns>
		/// <seealso cref="QueryCustomFactory"/>
		public IQuery Assemble(IBuilderContext context,
													QueryDataBase objectConfiguration,
													IConfigurationSource configurationSource,
													ConfigurationReflectionCache reflectionCache)
		{
			// cast the configuration data to the specifc data type
			WebServiceQueryData castObjectConfiguration = (WebServiceQueryData)objectConfiguration;
			// create the custom command associated with this query
			ICustomCommand customCommand = QueryAssemblerHelper.CreateCustomCommand(castObjectConfiguration.CustomCommandName);
			// create the set of paramters associated with this query
			IParameterSet parameterSet = QueryAssemblerHelper.CreateParameterSet(castObjectConfiguration.ParameterSetName);
			// create an instrumentation provider
			QueryInstrumentationProvider instrumentationProvider = QueryAssemblerHelper.CreateInstrumentationProvider(castObjectConfiguration.Name,
																																																								configurationSource,
																																																								reflectionCache);
			// create the query
			IQuery createdObject = new WebServiceQuery(castObjectConfiguration.Name,
																								castObjectConfiguration.Address,
																								castObjectConfiguration.Service,
																								castObjectConfiguration.Method,
																								customCommand,
																								parameterSet,
																								instrumentationProvider);
			// return the fully built and populated query object
			return createdObject;
		}
		#endregion
	}
}
